package de.metas.handlingunits.ddorder.api;

import java.util.Collection;
import java.util.List;
import java.util.Properties;
import java.util.Set;

import org.adempiere.ad.dao.IQueryFilter;
import org.eevolution.model.I_DD_Order;

import de.metas.handlingunits.model.I_DD_OrderLine;
import de.metas.handlingunits.model.I_M_HU;
import de.metas.util.ISingletonService;

/*
 * #%L
 * de.metas.handlingunits.base
 * %%
 * Copyright (C) 2015 metas GmbH
 * %%
 * This program is free software: you can redistribute it and/or modify
 * it under the terms of the GNU General Public License as
 * published by the Free Software Foundation, either version 2 of the
 * License, or (at your option) any later version.
 * 
 * This program is distributed in the hope that it will be useful,
 * but WITHOUT ANY WARRANTY; without even the implied warranty of
 * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
 * GNU General Public License for more details.
 * 
 * You should have received a copy of the GNU General Public
 * License along with this program.  If not, see
 * <http://www.gnu.org/licenses/gpl-2.0.html>.
 * #L%
 */

public interface IHUDDOrderDAO extends ISingletonService
{
	/**
	 * @return filter used to skip all those HUs which were scheduled to move on any DD_OrderLine.
	 */
	IQueryFilter<I_M_HU> getHUsNotAlreadyScheduledToMoveFilter();

	/**
	 * Adds given HU to the list of HUs scheduled to move on given DD_OrderLine.
	 * 
	 * @param ddOrderline
	 * @param hu
	 */
	void addToHUsScheduledToMove(I_DD_OrderLine ddOrderline, I_M_HU hu);

	/**
	 * Adds given HUs to the list of HUs scheduled to move on given DD_OrderLine.
	 * 
	 * @param ddOrderline
	 * @param hus
	 */
	void addToHUsScheduledToMove(I_DD_OrderLine ddOrderline, Collection<I_M_HU> hus);

	/**
	 * Retrieves all M_HU_IDs which were scheduled to move for given DD_OrderLine_IDs.
	 * 
	 * @param ctx
	 * @param ddOrderLineIds
	 * @return M_HU_IDs
	 */
	List<Integer> retrieveHUIdsScheduledToMove(Properties ctx, Set<Integer> ddOrderLineIds);

	/**
	 * Clears the "HUs scheduled to move" list for all DD_OrderLines of given DD_Order.
	 * 
	 * @param ddOrder
	 */
	void clearHUsScheduledToMoveList(I_DD_Order ddOrder);

	/**
	 * Clears the "HUs scheduled to move" list for given DD_OrderLine.
	 * 
	 * @param ddOrderline
	 */
	void clearHUsScheduledToMoveList(org.eevolution.model.I_DD_OrderLine ddOrderline);

	/**
	 * Remove given HUs from "HUs scheduled to move" list of given DD_OrderLine.
	 * 
	 * @param ddOrderline
	 * @param hus
	 */
	void removeFromHUsScheduledToMoveList(org.eevolution.model.I_DD_OrderLine ddOrderline, Collection<I_M_HU> hus);

	boolean existsDDOrderLineCandidateForHUId(int huId);

}
